#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/mutex.h>
#include <linux/atomic.h>
#include <asm/io.h>
#include <linux/of.h> 		  // 设备树 

// GPIO1_4 红灯
// GPIO4_20 绿灯
// GPIO4_19 蓝灯

#define GPIO1_4_MASK   (1 << 4)
// GPIO1_4引脚复用模式为ATL5
#define ATL5 (5)
#define GPIO1_4_MUX_MODE  ATL5
#define GPIO1_4_CLK_MASK  (3 << 26)

// GPIO4_19掩码(PWM7.OUT)
#define GPIO4_19_MASK   (1 << 19)
// GPIO4_20掩码(PWM8.OUT)
#define GPIO4_20_MASK   (1 << 20)
// GPIO4_19引脚和GPIO4_20复用模式为ATL5
#define ATL5 (5)
#define GPIO4_19_MUX_MODE  ATL5
#define GPIO4_20_MUX_MODE  ATL5
#define GPIO4_19_CLK_MASK  (3 << 12)
#define GPIO4_20_CLK_MASK  (3 << 12)

// 添加__iomem标记，编译器会检查此地址，确保在io空间
struct led_ctl_pin
{
	unsigned int __iomem *dr_pin;
	unsigned int __iomem *drir_pin;
	unsigned int __iomem *mux_pin;
	unsigned int __iomem *ctl_pin;
	unsigned int __iomem *clk_pin;
};

struct led_property
{
	struct device_node* node;
	struct property* proper;
	const char* status;
	unsigned int reg[12];
	struct led_ctl_pin pin;
};

// 设备结构体
struct my_led_dev {
	struct cdev cdev;  // 字符设备结构体
	struct led_property r_p;  // 保存从设备树中读取的红色led属性
	struct led_property g_p;  // 保存从设备树中读取的绿色led属性
	struct led_property b_p;  // 保存从设备树中读取的蓝色led属性
	dev_t devno;  // 设备号
	struct class* my_led_class;
	struct device* my_led_device;
    struct mutex mutex;  // 用于同步的互斥体
	unsigned int r_on_cnt; // 红色led亮的次数
	unsigned int g_on_cnt; // 红色led亮的次数
	unsigned int b_on_cnt; // 红色led亮的次数
};